package com.gongj.aop.aspectconfig;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * @program: aop
 * @description:切面类
 * @author: gongj
 * @Description: TODO
 * @create: 2020-07-19 19:42
 **/
@Aspect
@Component
public class AopAspect {

    /**
     * 定义切入点:切入点为com.gongj.aop.service所有的方法，其中所有的方法可以称之为：连接点
     */
   // @Pointcut("execution(* com.gongj.aop.service..*.*(..))")
  // @Pointcut("args(java.lang.String)")
    @Pointcut("@annotation(com.gongj.aop.zhujie.Gongj)")
    //service包下面所有的方法，但不能是String的参数类型
    //@Pointcut("execution(* com.gongj.aop.service..*.*(..)) && !pointcutargs()")
    public void pointcut(){
        System.out.println("2222222222222");
    }

    @Pointcut("args(java.lang.String)")
    public void pointcutargs(){
        System.out.println("333333333333333");
    }

    @Pointcut("this(com.gongj.aop.service.impl.AopServiceImpl)")
    public void pointcutThis(){
        System.out.println("44444444444444");
    }

    @Pointcut("target(com.gongj.aop.service.impl.AopServiceImpl)")
    public void pointcutTarget(){
        System.out.println("44444444444444");
    }

  ///  @Pointcut("@args(com.gongj.aop.zhujie.Gongj)")
 //   public void pointcutArgsZhuj(){
  //      System.out.println("44444444444444");
   // }
    // && pointcutArgsZhuj()
    @Pointcut("within(com.gongj.aop.*..*)")
    public void pointcutWithin(){
        System.out.println("2222222222222");
    }
    /**
     * 定义前置通知：在连接点执行之前执行的通知
     */
    @Before("pointcut()")
    public void beforeAdvice(){
        System.out.println("方法执行之前");
    }

    /**
     * 定义后置通知：在连接点执行之后执行的通知
     */
    @After("pointcut()")
    public void afterAdvice(){
        System.out.println("方法执行之后");

    }
}
